home *** CD-ROM | disk | FTP | other *** search
/ Crack It! / Crack It!.iso / CONTENT / DISKEDIT / MENURT.PAS < prev    next >
Pascal/Delphi Source File  |  1996-09-09  |  8KB  |  282 lines

  1. {
  2.  ***
  3.  
  4.  MENURT.PAS
  5.  Menu Interface Unit
  6.  (C)Copyright Gerard Paul Java 1996
  7.  
  8.  This unit implements an object-oriented menu.
  9.  
  10.  ***
  11. }
  12.  
  13. unit MenuRt;
  14.  
  15. interface
  16.  
  17. type
  18.   ItemNameType = string[30];
  19.   ItemDescType = string[60];
  20.  
  21.   ShortCutKeysType = string[20];
  22.  
  23.   ItemPtrType = ^ItemRec;
  24.   ItemRec = record
  25.               Name: ItemNameType;
  26.               Description: ItemDescType;
  27.               Prev,Next: ItemPtrType;
  28.             end;
  29.  
  30.   MenuType = object
  31.                ItemList: ItemPtrType;
  32.                LastNodeAdded: ItemPtrType;
  33.                SelectedItemPtr: ItemPtrType;
  34.                ShortCutKeys: ShortCutKeysType;
  35.                ItemCount: byte;
  36.                MenuX: byte;
  37.                MenuY: byte;
  38.                lWinPos: byte;
  39.                uWinPos: byte;
  40.                rWinPos: byte;
  41.                dWinPos: byte;
  42.                procedure Init;
  43.                procedure SetScreenPos(xPos,yPos: byte);
  44.                procedure AddItem(Name: ItemNameType;
  45.                                  Description: ItemDescType);
  46.                procedure Show;
  47.                procedure Operate(var Postn: byte;
  48.                                  var HelpSignal: boolean);
  49.                procedure DisposeMenu;
  50.              end;
  51.  
  52. var
  53.   NormOptKeyAttr: byte;
  54.   OptionNormTextAttr: byte;
  55.   SelectedOptKeyAttr: byte;
  56.   OptionSelectedTextAttr: byte;
  57.   HelpLineTextAttr: byte;
  58.  
  59. implementation
  60. uses Crt,ScreenRt,SysRt;
  61.  
  62. const
  63.   NotSelected = False;
  64.   Selected = True;
  65.  
  66. procedure MenuType.Init;
  67. begin
  68.   ItemCount := 0;
  69.   ShortCutKeys := '';
  70.   ItemList := nil;
  71. end;
  72.  
  73. procedure MenuType.SetScreenPos;
  74. begin
  75.   MenuX := xPos;
  76.   MenuY := yPos;
  77.   lWinPos := MenuX+1;
  78.   uWinPos := MenuY+1;
  79.   rWinPos := MenuX+30;
  80.   dWinPos := MenuY+ItemCount;
  81.  
  82.   SelectedItemPtr := ItemList;
  83. end;
  84.  
  85. procedure MenuType.AddItem;
  86. var
  87.   tItemNode: ItemPtrType;
  88.  
  89. begin
  90.   New(tItemNode);
  91.  
  92.   tItemNode^.Name := Name;
  93.   tItemNode^.Description := Description;
  94.  
  95.   if ItemList = nil then
  96.     ItemList := tItemNode
  97.   else
  98.     begin
  99.       tItemNode^.Prev := LastNodeAdded;
  100.       LastNodeAdded^.Next := tItemNode;
  101.     end;
  102.  
  103.   tItemNode^.Next := ItemList;
  104.   ItemList^.Prev := tItemNode;
  105.   LastNodeAdded := tItemNode;
  106.   Inc(ItemCount);
  107.  
  108.   ShortCutKeys := ShortCutKeys+
  109.                   UpCase(tItemNode^.Name[Pos('^',tItemNode^.Name)+1]);
  110. end;
  111.  
  112. procedure DisplayMenuItem(var ItemName: ItemNameType;IsSelected: boolean);
  113. var
  114.   MarkerPos: byte;
  115.   ItemLength: byte;
  116.   HighAttr,
  117.   OptionLoAttr: byte;
  118.  
  119. begin { proc }
  120.   MarkerPos := Pos(KeyMarker,ItemName);       { Determine position of key letter. }
  121.  
  122.   case IsSelected of
  123.     NotSelected:  begin
  124.                     HighAttr := NormOptKeyAttr;
  125.                     OptionLoAttr := OptionNormTextAttr;
  126.                   end;
  127.     Selected: begin
  128.                 HighAttr := SelectedOptKeyAttr;
  129.                 OptionLoAttr := OptionSelectedTextAttr;
  130.               end;
  131.   end;
  132.  
  133.   ItemLength := Length(ItemName);     { Record item length. }
  134.   TextAttr := OptionLoAttr;Write(Space+Copy(ItemName,1,MarkerPos-1));
  135.   TextAttr := HighAttr;Write(ItemName[MarkerPos+1]);
  136.   TextAttr := OptionLoAttr;Write(Copy(ItemName,MarkerPos+2,ItemLength-MarkerPos));
  137.   ClrEol;
  138. end; { proc }
  139.  
  140. procedure DescribeMenuItem(var Description: ItemDescType);
  141. begin
  142.   Window(2,24,62,25);
  143.   TextAttr := HelpLineTextAttr;Write(Description);
  144.   ClrEol;
  145. end; { proc }
  146.  
  147. procedure MenuType.Show;
  148. var
  149.   ItemCtr: byte;
  150.   AuxItemPtr: ItemPtrType;
  151.  
  152. begin
  153.   Window(1,1,80,25);
  154.  
  155.   TextAttr := HelpLineTextAttr;GotoXY(1,24);ClrEol;
  156.  
  157.   TextAttr := BoxAttr;
  158.   DrawBox(MenuX,MenuY,MenuX+31,MenuY+ItemCount+1,DoubleLine);
  159.  
  160.   Window(lWinPos,uWinPos,rWinPos,dWinPos);
  161.  
  162.   AuxItemPtr := ItemList;
  163.  
  164.   for ItemCtr := 1 to ItemCount do
  165.     begin
  166.       GotoXY(1,ItemCtr);DisplayMenuItem(AuxItemPtr^.Name,NotSelected);
  167.       AuxItemPtr := AuxItemPtr^.Next;
  168.     end;
  169. end;
  170.  
  171. procedure MenuType.Operate;
  172. var
  173.   Keystroke: char;
  174.   ShortCutKeyPos: byte;
  175.   TerminateLoop: boolean;
  176.   AuxItemPtr: ItemPtrType;
  177.   ItemCtr: byte;
  178.  
  179. procedure GotoItem(Postn: byte;var tNode: ItemPtrType);
  180. var
  181.   ItemCtr: byte;
  182.  
  183. begin
  184.   ItemCtr := 1;
  185.   tNode := ItemList;
  186.  
  187.   while ItemCtr <> Postn do
  188.     begin
  189.       tNode := tNode^.Next;
  190.       Inc(ItemCtr);
  191.     end;
  192. end;
  193.  
  194. begin
  195.   Window(lWinPos,uWinPos,rWinPos,dWinPos);
  196.  
  197.   GotoItem(Postn,SelectedItemPtr);
  198.  
  199.   AuxItemPtr := SelectedItemPtr;
  200.   HelpSignal := False;
  201.   TerminateLoop := False;
  202.  
  203.   repeat
  204.     GotoXY(1,Postn);DisplayMenuItem(SelectedItemPtr^.Name,Selected);
  205.     DescribeMenuItem(SelectedItemPtr^.Description);
  206.     Window(lWinPos,uWinPos,rWinPos,dWinPos);
  207.  
  208.     Keystroke := UpCase(ReadKey);
  209.  
  210.     GotoXY(1,Postn);DisplayMenuItem(SelectedItemPtr^.Name,NotSelected);
  211.  
  212.     case Keystroke of                            { Check character entered. }
  213.       ExtKey                  : case ReadKey of     { Extended key pressed. }
  214.                                   F1       : begin
  215.                                                HelpSignal := True;
  216.                                                TerminateLoop := True;
  217.                                              end;
  218.                                   HomeKey  : begin
  219.                                                Postn := 1;
  220.                                                SelectedItemPtr := ItemList;
  221.                                              end;
  222.                                   EndKey   : begin
  223.                                                Postn := ItemCount;
  224.                                                SelectedItemPtr := LastNodeAdded;
  225.                                              end;
  226.                                   UpKey    : begin
  227.                                                Dec(Postn);
  228.                                                if Postn < 1 then
  229.                                                  Postn := ItemCount;
  230.  
  231.                                                SelectedItemPtr := SelectedItemPtr^.Prev;
  232.                                              end; { UpKey }
  233.                                   DownKey  : begin
  234.                                                Inc(Postn);
  235.                                                if Postn > ItemCount then
  236.                                                  Postn := 1;
  237.  
  238.                                                SelectedItemPtr := SelectedItemPtr^.Next;
  239.                                              end; { DownKey }
  240.                                 end;  { case #0 }
  241.       Enter: TerminateLoop := True;
  242.       Esc,AltExitKey: begin
  243.                         Postn := 0;
  244.                         TerminateLoop := True;
  245.                       end;
  246.       else
  247.         begin
  248.           ShortCutKeyPos := Pos(Keystroke,ShortCutKeys);
  249.           if ShortCutKeyPos <> 0 then
  250.             begin
  251.               Postn := ShortCutKeyPos;
  252.  
  253.               GotoItem(Postn,SelectedItemPtr);
  254.  
  255.               TerminateLoop := True;
  256.             end;
  257.         end;
  258.     end; { case not #0 }
  259.   until TerminateLoop;
  260. end; { proc }
  261.  
  262. procedure MenuType.DisposeMenu;
  263. var
  264.   AuxItemPtr1: ItemPtrType;
  265.   AuxItemPtr2: ItemPtrType;
  266.  
  267. begin
  268.   AuxItemPtr1 := ItemList;
  269.   AuxItemPtr2 := ItemList^.Next;
  270.  
  271.   repeat
  272.     Dispose(AuxItemPtr1);
  273.     AuxItemPtr1 := AuxItemPtr2;
  274.  
  275.     if AuxItemPtr2 <> nil then
  276.       AuxItemPtr2 := AuxItemPtr2^.Next;
  277.   until AuxItemPtr1 = nil;
  278. end;
  279.  
  280. end.
  281.  
  282.